package top.zhangjianyong.tools.indicator.factory;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import top.zhangjianyong.tools.indicator.strategy.TechnicalIndicator;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 技术指标计算器工厂类
 * 管理所有指标计算器实例，根据指标名称获取对应的计算器
 *
 * @author zhangjianyong
 * @date 2024/01/01
 */
@Slf4j
@Component
public class IndicatorFactory {

    @Autowired
    private List<TechnicalIndicator> indicators;

    /**
     * 指标计算器Map，key为指标名称，value为计算器实例
     */
    private Map<String, TechnicalIndicator> indicatorMap;

    @PostConstruct
    public void init() {
        indicatorMap = new HashMap<>();
        for (TechnicalIndicator indicator : indicators) {
            String name = indicator.getName();
            if (indicatorMap.containsKey(name)) {
                log.warn("发现重复的指标名称: {}, 将覆盖之前的实例", name);
            }
            indicatorMap.put(name, indicator);
            log.debug("注册指标计算器: {}", name);
        }
        log.info("共注册 {} 个技术指标计算器", indicatorMap.size());
    }

    /**
     * 根据指标名称获取指标计算器
     *
     * @param indicatorName 指标名称
     * @return 指标计算器实例，如果不存在则返回null
     */
    public TechnicalIndicator getIndicator(String indicatorName) {
        return indicatorMap.get(indicatorName);
    }

    /**
     * 获取所有指标计算器
     *
     * @return 所有指标计算器Map
     */
    public Map<String, TechnicalIndicator> getAllIndicators() {
        return new HashMap<>(indicatorMap);
    }

    /**
     * 检查指标是否存在
     *
     * @param indicatorName 指标名称
     * @return true表示存在
     */
    public boolean hasIndicator(String indicatorName) {
        return indicatorMap.containsKey(indicatorName);
    }

    /**
     * 获取所有已注册的指标名称
     *
     * @return 指标名称集合
     */
    public java.util.Set<String> getAllIndicatorNames() {
        return indicatorMap.keySet();
    }
}

